package n_03;

import java.util.HashSet;
import java.util.Set;

/**
 * @author ChengMiao
 * @date 2021/6/28 14:50
 * @Desc No.3 无重复字符的最长子串v
 * 给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。
 */
public class Demo {
    public static void main(String[] args) {
        String s = "abcb";
        // pwwkew
        // abcdabc
        // bbbbbbbx
        System.out.println(lengthOfLongestSubstring(s));
    }


    public static  int lengthOfLongestSubstring(String s) {

        // 使用一个set集合记录每次遍历时候未重复的最大长度字符串
        // 相当于从一个索引依次向后查找未重复的长度字符串 直至最后

//        // 哈希集合，记录每个字符是否出现过
//        Set<Character> occ = new HashSet<Character>();
//        int n = s.length();
//        // 右指针，初始值为 -1，相当于我们在字符串的左边界的左侧，还没有开始移动
//        int rk = -1, ans = 0;
//        for (int i = 0; i < n; ++i) {
//            if (i != 0) {
//                // 左指针向右移动一格，移除一个字符
//                occ.remove(s.charAt(i - 1));
//            }
//            while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
//                // 不断地移动右指针
//                occ.add(s.charAt(rk + 1));
//                ++rk;
//            }
//            // 第 i 到 rk 个字符是一个极长的无重复字符子串
//            ans = Math.max(ans, rk - i + 1);
//        }
//        return ans;

        // p w w  k e w
        // p w
        // w
        // w k e
        // k e w

        Set<Character> set = new HashSet<>();
        char[] arr = s.toCharArray();
        int size = arr.length>1?0:arr.length;
        for (int i = 0; i < arr.length-1; i++) {
            set.add(arr[i]);
            for (int j = i + 1; j < arr.length; j++) {
                if (set.contains(arr[j])) {
                    size = Math.max(size, set.size());
                    set = new HashSet<>();
                    break;
                }
                set.add(arr[j]);
            }
        }



        return Math.max(size, set.size());

    }
}
